Български

Разгледайте задълбочено Composition API на Vue.js 3. Научете се да създавате преизползваеми, поддържаеми и тестваеми Vue.js приложения с практически примери и най-добри практики.

Composition API на Vue.js 3: Задълбочен поглед за глобални разработчици

Vue.js бързо се превърна в популярен избор за изграждане на модерни уеб приложения, благодарение на достъпната си крива на учене и мощни функции. Vue.js 3 отива още по-далеч с въвеждането на Composition API, нов начин за организиране на логиката на вашите компоненти. Този задълбочен анализ предоставя изчерпателно ръководство за разбиране и ефективно използване на Composition API, като ви дава уменията да създавате по-поддържаеми, преизползваеми и тестваеми Vue приложения.

Какво представлява Composition API?

Composition API е набор от API-та, които ни позволяват да създаваме Vue компоненти, използвайки импортирани функции, вместо да декларираме опции. По същество той ви позволява да групирате свързана логика заедно, независимо къде се появява в шаблона. Това е в контраст с Options API (data, methods, computed, watch), който ви принуждава да организирате кода въз основа на тези предварително дефинирани категории. Мислете за Options API като за организиране на кода по това *какво* е той (данни, метод и т.н.), докато Composition API ви позволява да организирате кода по това *какво прави*.

Ядрото на Composition API се върти около функцията setup(). Тази функция е входната точка за използване на Composition API в рамките на един компонент. Вътре в setup() можете да дефинирате реактивно състояние, изчисляеми свойства, методи и функции на жизнения цикъл (lifecycle hooks), използвайки композируеми функции.

Защо да използваме Composition API?

Composition API предлага няколко предимства пред традиционния Options API, особено за по-големи и по-сложни приложения:

Разбиране на основните концепции

Нека се потопим в ключовите концепции, които са в основата на Composition API:

1. setup()

Както споменахме по-рано, setup() е входната точка за използване на Composition API. Това е опция на компонента, която се изпълнява преди създаването на компонента. Вътре в setup() вие дефинирате реактивно състояние, изчисляеми свойства, методи и функции на жизнения цикъл, след което връщате обект, съдържащ стойностите, които искате да изложите на шаблона.

Пример:

import { ref } from 'vue'

export default {
  setup() {
    const count = ref(0)

    const increment = () => {
      count.value++
    }

    return {
      count,
      increment
    }
  }
}

В този пример използваме ref, за да създадем реактивна променлива, наречена count. Също така дефинираме метод, наречен increment, който увеличава стойността на count. Накрая връщаме обект, съдържащ count и increment, което ги прави достъпни в шаблона на компонента.

2. Реактивно състояние с ref и reactive

Composition API предоставя две основни функции за създаване на реактивно състояние: ref и reactive.

Пример с ref:

import { ref } from 'vue'

export default {
  setup() {
    const message = ref('Hello, Vue!')

    const updateMessage = (newMessage) => {
      message.value = newMessage
    }

    return {
      message,
      updateMessage
    }
  }
}

Пример с reactive:

import { reactive } from 'vue'

export default {
  setup() {
    const state = reactive({
      name: 'John Doe',
      age: 30
    })

    const updateName = (newName) => {
      state.name = newName
    }

    return {
      state,
      updateName
    }
  }
}

3. Изчисляеми свойства с computed

Изчисляемите свойства са стойности, които се извличат от друго реактивно състояние. Те се актуализират автоматично, когато техните зависимости се променят. Функцията computed приема getter функция като аргумент и връща реактивен ref само за четене.

Пример:

import { ref, computed } from 'vue'

export default {
  setup() {
    const firstName = ref('John')
    const lastName = ref('Doe')

    const fullName = computed(() => {
      return `${firstName.value} ${lastName.value}`
    })

    return {
      firstName,
      lastName,
      fullName
    }
  }
}

В този пример fullName е изчисляемо свойство, което зависи от firstName и lastName. Когато firstName или lastName се промени, fullName ще бъде автоматично актуализиран.

4. Наблюдатели с watch и watchEffect

Наблюдателите ви позволяват да реагирате на промени в реактивното състояние. Composition API предоставя два основни начина за създаване на наблюдатели: watch и watchEffect.

Пример с watch:

import { ref, watch } from 'vue'

export default {
  setup() {
    const count = ref(0)

    watch(
      count,
      (newValue, oldValue) => {
        console.log(`Count changed from ${oldValue} to ${newValue}`)
      }
    )

    const increment = () => {
      count.value++
    }

    return {
      count,
      increment
    }
  }
}

Пример с watchEffect:

import { ref, watchEffect } from 'vue'

export default {
  setup() {
    const message = ref('Hello')

    watchEffect(() => {
      console.log(`Message is: ${message.value}`)
    })

    const updateMessage = (newMessage) => {
      message.value = newMessage
    }

    return {
      message,
      updateMessage
    }
  }
}

5. Функции на жизнения цикъл (Lifecycle Hooks)

Composition API предоставя достъп до функциите на жизнения цикъл на компонента чрез функции, които започват с on, като onMounted, onUpdated и onUnmounted. Тези функции приемат callback като аргумент, който ще бъде изпълнен, когато съответната функция на жизнения цикъл бъде задействана.

Пример:

import { onMounted, onUnmounted } from 'vue'

export default {
  setup() {
    onMounted(() => {
      console.log('Component is mounted')
    })

    onUnmounted(() => {
      console.log('Component is unmounted')
    })

    return {}
  }
}

Създаване на композируеми функции (Composable Functions)

Истинската сила на Composition API идва от възможността за създаване на преизползваеми композируеми функции. Композируемата функция е просто функция, която капсулира част от логиката на компонента и връща реактивно състояние и функции, които могат да се използват в множество компоненти.

Пример: Нека създадем композируема функция, която проследява позицията на мишката:

import { ref, onMounted, onUnmounted } from 'vue'

export function useMousePosition() {
  const x = ref(0)
  const y = ref(0)

  const updatePosition = (event) => {
    x.value = event.clientX
    y.value = event.clientY
  }

  onMounted(() => {
    window.addEventListener('mousemove', updatePosition)
  })

  onUnmounted(() => {
    window.removeEventListener('mousemove', updatePosition)
  })

  return {
    x,
    y
  }
}

Сега можете да използвате тази композируема функция във всеки компонент:

import { useMousePosition } from './useMousePosition'

export default {
  setup() {
    const { x, y } = useMousePosition()

    return {
      x,
      y
    }
  }
}

Практически примери и случаи на употреба

Нека разгледаме някои практически примери за това как Composition API може да се използва в реални сценарии:

1. Извличане на данни

Създаването на композируема функция за извличане на данни от API е често срещан случай на употреба. Това ви позволява да използвате повторно същата логика за извличане на данни в множество компоненти.

import { ref, onMounted } from 'vue'

export function useFetch(url) {
  const data = ref(null)
  const error = ref(null)
  const loading = ref(true)

  onMounted(async () => {
    try {
      const response = await fetch(url)
      data.value = await response.json()
    } catch (err) {
      error.value = err
    } finally {
      loading.value = false
    }
  })

  return {
    data,
    error,
    loading
  }
}

След това можете да използвате тази композируема функция във вашите компоненти по следния начин:

import { useFetch } from './useFetch'

export default {
  setup() {
    const { data, error, loading } = useFetch('https://api.example.com/data')

    return {
      data,
      error,
      loading
    }
  }
}

2. Валидация на форми

Валидацията на форми е друга област, в която Composition API може да бъде много полезен. Можете да създавате композируеми функции, които капсулират логиката за валидация и да ги използвате повторно в различни форми.

import { ref } from 'vue'

export function useValidation() {
  const errors = ref({})

  const validateField = (fieldName, value, rules) => {
    let error = null
    for (const rule of rules) {
      if (rule === 'required' && !value) {
        error = 'This field is required'
        break
      } else if (rule === 'email' && !/^[^\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/.test(value)) {
        error = 'Invalid email format'
        break
      }
    }

    if (error) {
      errors.value[fieldName] = error
    } else {
      delete errors.value[fieldName]
    }
  }

  return {
    errors,
    validateField
  }
}

Използване в компонент:

import { useValidation } from './useValidation'
import { ref } from 'vue'

export default {
  setup() {
    const { errors, validateField } = useValidation()
    const email = ref('')

    const validateEmail = () => {
      validateField('email', email.value, ['required', 'email'])
    }

    return {
      email,
      errors,
      validateEmail
    }
  }
}

3. Управление на удостоверяването на потребители

Логиката за удостоверяване често може да бъде сложна и дублирана в множество компоненти. Composition API ви позволява да създадете композируема функция, която капсулира цялата логика за удостоверяване и предоставя изчистен API за използване от вашите компоненти.

Пример: (Опростен)

import { ref } from 'vue'

export function useAuth() {
  const isLoggedIn = ref(false)
  const user = ref(null)

  const login = async (username, password) => {
    // Simulate API call
    await new Promise(resolve => setTimeout(resolve, 1000))
    isLoggedIn.value = true
    user.value = { username }
  }

  const logout = async () => {
    // Simulate API call
    await new Promise(resolve => setTimeout(resolve, 1000))
    isLoggedIn.value = false
    user.value = null
  }

  return {
    isLoggedIn,
    user,
    login,
    logout
  }
}

Най-добри практики за използване на Composition API

За да извлечете максимума от Composition API, обмислете следните най-добри практики:

Често срещани капани и как да ги избегнем

Въпреки че Composition API предлага много предимства, има и някои често срещани капани, за които трябва да знаете:

Composition API и глобалните екипи

Composition API насърчава сътрудничеството в рамките на глобални екипи за разработка, като насърчава:

Заключение

Composition API на Vue.js 3 е мощен инструмент, който може значително да подобри организацията, преизползваемостта и възможността за тестване на вашите Vue приложения. Като разберете основните концепции и следвате най-добрите практики, очертани в този задълбочен анализ, можете да използвате Composition API за изграждане на по-поддържаеми и мащабируеми приложения за глобална аудитория. Прегърнете Composition API и отключете пълния потенциал на Vue.js 3.

Насърчаваме ви да експериментирате с Composition API във вашите собствени проекти и да изследвате огромните възможности, които предлага. Приятно кодиране!